home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / e / amigae30a_fr.lha / AmigaE30f / Sources / Various / Pi.e < prev    next >
Encoding:
Text File  |  1994-10-02  |  2.3 KB  |  81 lines

  1. /* Un autre programme de calcul de pi.
  2.    Un bon exemple de ce quoi l'optimisation avec l'utilisation de
  3.    l'assembleur en ligne peut faire:
  4.    Le sources E est la traduction du source original C, qui met 48 secondes
  5.    pour 250 décimales, la version E met 30 secondes.
  6.    La boucle la plus interne a été mises en assembleur, cette version
  7.    (E+ASm) prend seulement 10 secondes (tous sur 7 MHz).
  8.    Seulement une petite pqrtie a besoin d'être traduite en assembleur, comme
  9.    c'est là que se fait 99% du calcul   */
  10.  
  11. DEF m,k,n,p,i,max,nr,handle,out,num[50]:STRING,a:PTR TO LONG
  12.  
  13. PROC main()
  14.   WriteF('Calcul de PI\nNb de décimales (try 50-250): ')
  15.   ReadStr(stdout,num)
  16.   IF (nr:=Val(num,NIL))=0 THEN stop('Illégal #!\n')
  17.   WriteF('Calcule ... pressez CtrlC pour arrêter.\n\n')
  18.   max:=nr*16
  19.   IF (a:=New(max))=NIL THEN stop('Plus de mémoire!\n')
  20.   m:=nr
  21.   k:=m!*3.321-1!
  22.   WriteF('\d\c',k,13)
  23.   FOR n:=k TO 1 STEP -1
  24.     a[0]:=a[0]+2
  25.     p:=n*2+1
  26.     MOVEQ   #0,D7       /* D7=c */
  27.     MOVE.L  a,A0        /* A0=a tableau */
  28.     MOVE.L  m,D4        /* D4=i compteur */
  29.     MOVE.L  p,D2
  30.     MOVE.L  n,D3
  31. l:  MOVE.L  D7,D0       /* cette boucle est hyper optimisée. */
  32.     LSL.L   #3,D0
  33.     ADD.L   D7,D0       /* à la suite, l'équivalent E */
  34.     ADD.L   D7,D0
  35.     MOVE.L  (A0),D1     /* c:=0               */
  36.     MULU    D3,D1       /* x:=a               */
  37.     ADD.L   D1,D0       /* FOR i:=0 TO m      */
  38.     DIVU    D2,D0       /*   c:=10*c+(n*^x)   */
  39.     MOVE.L  D0,D7       /*   ^x:=c/p          */
  40.     EXT.L   D0          /*   c:=c-(^x*p)      */
  41.     MOVE.L  D0,(A0)     /*   x:=x+4           */
  42.     SWAP    D7          /* ENDFOR             */
  43.     EXT.L   D7
  44.     ADDQ.L  #4,A0
  45.     DBRA    D4,l
  46.     IF (n AND $F)=0     /* pas toutes les boucles */
  47.       WriteF('\d     \c',n,13)
  48.       IF CtrlC() THEN stop('\n*** Calcul arrêtée!\n')
  49.     ENDIF
  50.   ENDFOR
  51.   FOR i:=m TO 1 STEP -1
  52.     IF a[i]>9
  53.       a[i]:=a[i]-10
  54.       a[i-1]:=a[i-1]+1
  55.     ENDIF
  56.   ENDFOR
  57.   handle:=Open('ram:pi.txt',1006)
  58.   IF handle<>NIL
  59.     out:=SetStdOut(handle)
  60.     writenum()
  61.     SetStdOut(out)
  62.     Close(handle)
  63.     WriteF('\n\nRegardez ram:pi.txt pour la sortie.\n')
  64.   ELSE
  65.     WriteF('Ne peut ouvrir le fichier de sortie!\n')
  66.   ENDIF
  67.   WriteF('\n')
  68.   writenum()
  69. ENDPROC
  70.  
  71. PROC stop(messy)
  72.   WriteF(messy)
  73.   CleanUp(5)
  74. ENDPROC
  75.  
  76. PROC writenum()
  77.   WriteF('pi=3.')
  78.   FOR i:=1 TO m DO WriteF('\d',a[i])
  79.   WriteF('\n')
  80. ENDPROC
  81.